from flask import Flask,redirect,request,g
from config import config_dict
from flask_sqlalchemy import SQLAlchemy
from redis import StrictRedis
from flask_wtf import CSRFProtect
from flask_session import Session

# 创建db对象
db = SQLAlchemy()

# 定义rs
rs = None

def create_app(env):

    # 判断传入的环境是否正确
    if env not in config_dict.keys():
        raise Exception(f"创建环境有问题,请使用 {config_dict.keys()}")

    # 创建应用程序对象
    app = Flask(__name__)

    # 加载项目配置信息
    conf_env = config_dict[env]
    app.config.from_object(conf_env)

    # 创建sqlalchemy
    db.init_app(app)

    # 创建redis对象
    global rs
    rs = StrictRedis(host=conf_env.REDIS_HOST,port=conf_env.REDIS_PORT,db=conf_env.REDIS_DB,decode_responses=True)

    # 保护应用程序CSRF
    CSRFProtect(app=app)

    # 设置状态保持
    Session(app=app)

    # 注册首页蓝图
    from info.modules.index import index_blue
    app.register_blueprint(index_blue)

    # 注册认证蓝图
    from info.modules.passport import passport_blue
    app.register_blueprint(passport_blue)

    # 注册新闻蓝图
    from info.modules.news import news_blue
    app.register_blueprint(news_blue)

    # 注册用户蓝图
    from info.modules.profile import profile_blue
    app.register_blueprint(profile_blue)

    # 注册管理蓝图
    from info.modules.admin import admin_blue
    app.register_blueprint(admin_blue)

    print(app.url_map) # 查看app身上有哪些地址可以被访问

    # 监听404异常信息,并统一进行处理
    @app.errorhandler(404)
    def page_not_found(e):
        return redirect("/404")

    # 限制管理员登录普通用户页面
    # from info.utils.commons import user_login_data
    # @app.before_request
    # @user_login_data
    # def before_request():
    #     # 如果是一个管理员,访问了普通用户页面,那么给我重定向到管理员的首页
    #     if g.user and g.user.is_admin:
    #         if not (request.path.startswith("/admin") or request.path.startswith("/static/admin")):
    #             print("管理员访问了非管理员页面")
    #             return redirect("/admin/index")

    # 返回app
    return app
